/*
    内存分区
        常量区              常量            const
        静态全局区          函数外变量       静态   static
        堆区                动态内存        malloc          
        栈区                函数内变量      

    进程分配内存
    内核空间
        大小 1G
        特性 所有进程都共享一个内核空间 用户控件使用内核的时候 需要申请

    用户空间
        大小 0-3G
             虚拟内存
        特性 当一个进程创建了后 系统自动分配0-3G的用户空间

    用户空间的分层
        栈空间      栈区
        文件映射区  当需要操作文件时 会将文件映射到内存中 供CPU操作
        堆空间      动态内存
        BSS         没有初始化的<数据段>
        数据段      静态全局区
        代码段      常量区
        保留区
*/

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

int main(int argc, char const *argv[])
{
    
    //创建单个内存
    int * val_1 = new int;
    *val_1 = 10;
    cout << "*val_1 = " << *val_1 << endl;

    //创建单个内存 并初始化     可以在括号内写值 也可以直接在括号内 写变量
    int * val_2 = new int(15);
    cout << "val_2 = " << *val_2 << endl;
    
    int *val_3 = new int(*val_2);
    cout << "val_3 = " << *val_3 << endl;

    //创建多个内存
    int *arr = new int[5];
    
    //写入数据
    for(size_t i = 0; i < 5;i++)
    {
        arr[i] = i;
    }

    //读取数据
    for(size_t i = 0;i < 5;i++)
    {
        cout << "arr = " << arr[i] << endl;
    }

    //释放动态内存
    delete val_1 ;
    delete val_2 ;
    delete val_3 ;
    //释放内存
    delete [] arr;

    return 0;
}

/*
<span style="font-size: 18px; color: red;">要记，面试会问</span>

1、`new/delete` 是 C++ 的关键字，`malloc/free` 是库函数。

2、`new` 在分配空间的同时可以进行初始化，`malloc` 不可以。 

3、`new` 分配的空间如果没有初始化，默认会初始化成 0；而 `malloc` 分配的空间如果没有初始化，里面都是随机值，需要自己手动调用 `memset` 或者 `bzero` 函数来清 0。

4、`new` 是根据类型分配的空间，而 `malloc` 是根据字节数分配空间的，需要自己调用 `sizeof()` 计算。

5、`new` 是要什么类型，返回的就是什么类型的指针；而 `malloc` 返回的都是 `void*`，需要自己强转成需要的类型。

6、`new` 在分配类对象空间的时候，会调用类的==构造函数==，`malloc` 不会。

7、`delete` 在释放类对象空间的时候，会调用类的==析构函数==，`free` 不会。
*/